﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Baza;
using System.IO;

namespace wsnForms
{
    public partial class Zamow : Form
    {
        //Definicja listy sprzetow i czasow ich rezerwacji
        private List<Sprzet> ListaSprzetow = new List<Sprzet>();
        private List<BazaDanych.czas> ListaCzasow = new List<BazaDanych.czas>();

        //Dodac pobieranie tej wartosci z bazy --> (Zbig) już dodałem :)
        int maksymalnyCzasWypozyczenia = System.Convert.ToInt32(BazaDanych.getKaryIUstalenia("maksymalny_czas_wypozyczenia"));

        public Zamow()
        {
            InitializeComponent();
            odswiezListe();
        }

        public Zamow(Sprzet sprzet)
        {
            InitializeComponent();
            ListaSprzetow.Add(sprzet);
            ListaCzasow.Add(new BazaDanych.czas(DateTime.Today, DateTime.Today));
            odswiezListe();
        }

        public void dodajSprzet(Sprzet sprzet)
        {
            if (sprzet.SpDoKonserwacji) MessageBox.Show("Ten sprzęt jest niedostępny. Został zgłoszony do konserwacji!");
            else
            {
                if (sprzet.SpUszkodzony) MessageBox.Show("Ten sprzęt jest niedostępny. Został zgłoszony jako uszkodzony!");
                else
                {
                    if (!sprzet.SpDostepny) MessageBox.Show("Ten sprzęt jest niedostępny!");
                    else
                    {
                        if (ListaSprzetow.Contains(sprzet)) MessageBox.Show("Ten sprzęt znajduje się już w koszyku!");
                        else
                        {
                            ListaSprzetow.Add(sprzet);
                            ListaCzasow.Add(new BazaDanych.czas(DateTime.Today, DateTime.Today));
                            odswiezListe();
                        }
                    }
                }
            }
        }

        public void usunSprzet(Sprzet sprzet)
        {
            try
            {
                ListaCzasow.RemoveAt(ListaSprzetow.IndexOf(sprzet));
                ListaSprzetow.Remove(sprzet);
                odswiezListe();
            }
            catch (Exception e)
            {
                MessageBox.Show("Błąd usuwania z koszyka!\n" + e.Message);
            }
        }

        public void usunSprzet(int index)
        {
            try
            {
                ListaCzasow.RemoveAt(index);
                ListaSprzetow.RemoveAt(index);
                odswiezListe();
            }
            catch (Exception e)
            {
                MessageBox.Show("Błąd usuwania z koszyka!\n" + e.Message);
            }
        }

        private bool czyPusta()
        {
            if (ListaSprzetow.Count == 0) return true;
            else return false;
        }

        public void zmienCzas(int index, DateTime dataOd, DateTime dataDo)
        {
            TimeSpan odlegloscCzasowa = dataDo - dataOd;

            if ((odlegloscCzasowa.Days <= maksymalnyCzasWypozyczenia - 1) && (odlegloscCzasowa.Days >= 0))
            {
                ListaCzasow.ElementAt(index).setDates(dataOd, dataDo);
            }
            else
            {
                MessageBox.Show("Czas wypożyczenia nie może być krótszy niż 1 dzień i dłuższy niż " + maksymalnyCzasWypozyczenia.ToString() + " dni!");
            }
        }

        private void odswiezListe()
        {
            if (czyPusta())
            {
                BoxSprzety.Items.Clear();
                BoxSprzety.Enabled = false;
                infoLabel.Text = "Twój koszyk jest pusty!";
            }
            else
            {
                BoxSprzety.Items.Clear();
                BoxSprzety.Enabled = true;
                infoLabel.Text = "";
                foreach (Sprzet element in ListaSprzetow)
                {
                    BoxSprzety.Items.Add(element.SpNazwa);
                }
                infoLabel.Text = "Liczba przedmiotów w koszyku: " + ListaSprzetow.Count.ToString();
            }
            odswiezDane();
        }

        private void odswiezDane()
        {
            if (BoxSprzety.SelectedIndex == -1)
            {
                labelNazwa.Text = "";
                labelProducent.Text = "";
                labelRozmiar.Text = "";
                labelCena.Text = "";
                labelWzrost.Text = "";
                labelWaga.Text = "";
                labelPlec.Text = "";
                usunZKoszyka.Enabled = false;
                zatwierdzDaty.Enabled = false;
                obrazek.SizeMode = PictureBoxSizeMode.Normal;
                obrazek.Image = obrazek.InitialImage;
            }
            else
            {
                wypelnijKalendarz(ListaSprzetow[BoxSprzety.SelectedIndex].SpId);
                labelNazwa.Text = ListaSprzetow[BoxSprzety.SelectedIndex].SpNazwa;
                labelProducent.Text = ListaSprzetow[BoxSprzety.SelectedIndex].SpProducent;
                labelRozmiar.Text = ListaSprzetow[BoxSprzety.SelectedIndex].SpRozmiar.ToString();

                //wyświetlanie obrazka dodane
                MemoryStream ms = new MemoryStream(ListaSprzetow[BoxSprzety.SelectedIndex].SpObrazek);
                obrazek.SizeMode = PictureBoxSizeMode.Zoom;
                obrazek.Image = Image.FromStream(ms);

                double cena = 0;
                TimeSpan odlegloscCzasowa = ListaCzasow[BoxSprzety.SelectedIndex].dataDo - ListaCzasow[BoxSprzety.SelectedIndex].dataOd;
                cena = (odlegloscCzasowa.Days + 1) * ListaSprzetow[BoxSprzety.SelectedIndex].SpCena;
                labelCena.Text = ListaSprzetow[BoxSprzety.SelectedIndex].SpCena.ToString("f2") + "zł * " + ((odlegloscCzasowa.Days + 1).ToString()) + " dni = " + cena.ToString("f2") + "zł";

                // Obsługa dat 

                zatwierdzDaty.Enabled = true;

                dataOd.Value = ListaCzasow[BoxSprzety.SelectedIndex].dataOd;
                dataDo.Value = ListaCzasow[BoxSprzety.SelectedIndex].dataDo;

                // Koniec obsługi dat

                if (ListaSprzetow[BoxSprzety.SelectedIndex].SpWzrost == "")
                {
                    labelWzrost.Text = "(brak)";
                }
                else
                {
                    labelWzrost.Text = ListaSprzetow[BoxSprzety.SelectedIndex].SpWzrost + " cm";
                }

                if (ListaSprzetow[BoxSprzety.SelectedIndex].SpWaga == "")
                {
                    labelWaga.Text = "(brak)";
                }
                else
                {
                    labelWaga.Text = ListaSprzetow[BoxSprzety.SelectedIndex].SpWaga + " kg";
                }

                switch (ListaSprzetow[BoxSprzety.SelectedIndex].SpPlec)
                {
                    case 'k': labelPlec.Text = "damski"; break;
                    case 'm': labelPlec.Text = "męski"; break;
                    case 'd': labelPlec.Text = "dziecięcy"; break;
                }

                usunZKoszyka.Enabled = true;
            }

            if (czyPusta())
            {
                wyczyscKoszyk.Enabled = false;
                ZlozZamowienie.Enabled = false;
                dataDo.Enabled = false;
                dataOd.Enabled = false;
                zatwierdzDlaWszystkich.Enabled = false;

                labelLacznaWartosc.Text = "0,00zł";
            }
            else
            {
                wyczyscKoszyk.Enabled = true;
                ZlozZamowienie.Enabled = true;
                dataDo.Enabled = true;
                dataOd.Enabled = true;
                zatwierdzDlaWszystkich.Enabled = true;

                double wartosc = 0;
                int i = 0;
                TimeSpan odlegloscCzasowa;
                foreach (Sprzet element in ListaSprzetow)
                {
                    odlegloscCzasowa = ListaCzasow[i].dataDo - ListaCzasow[i].dataOd;
                    wartosc += (odlegloscCzasowa.Days + 1) * element.SpCena;
                    i++;
                }
                labelLacznaWartosc.Text = wartosc.ToString("f2") + "zł";
            }
        }

        private void Ukryj_Click(object sender, EventArgs e)
        {
            this.Hide();
        }

        private void BoxSprzety_SelectedIndexChanged(object sender, EventArgs e)
        {
            odswiezDane();
        }

        private void usunZKoszyka_Click(object sender, EventArgs e)
        {
            usunSprzet(BoxSprzety.SelectedIndex);
            odswiezListe();
        }

        private void wyczyscKoszyk_Click(object sender, EventArgs e)
        {
            DialogResult czyNapewno = MessageBox.Show("Na pewno chcesz wyczyścić swój koszyk?", "Potwierdzenie wyczyszczenia koszyka", MessageBoxButtons.YesNo);
            switch (czyNapewno)
            {
                case DialogResult.Yes:
                    ListaSprzetow.Clear();
                    ListaCzasow.Clear();
                    odswiezListe();
                    break;
                case DialogResult.No: break;
            }
        }

        private void ZlozZamowienie_Click(object sender, EventArgs e)
        {
            int i = -1;
            bool czy_break = false;
            foreach (Sprzet element in ListaSprzetow)
            {
                i++;
                if (!BazaDanych.SprawdzDostepnosc(element.SpId, ListaCzasow[i].dataOd, ListaCzasow[i].dataDo)) czy_break = true;
                if (czy_break) break;
            }
            if (czy_break) MessageBox.Show("Sprzęt: " + ListaSprzetow[i].SpNazwa + " jest już zarezerwowany w tym okresie.");
            odswiezListe();

            if (!czy_break)
            {
                Potwierdzenie potwierdzenieDanych = new Potwierdzenie(ListaSprzetow, ListaCzasow);
                potwierdzenieDanych.Show();
            } 
        }

        private void zatwierdzDaty_Click(object sender, EventArgs e)
        {
        //DODAŁEM - zmienna przechowyjąca indeks wybrany na liście sprzętów
            int i = BoxSprzety.SelectedIndex;
            if (BazaDanych.SprawdzDostepnosc(ListaSprzetow[BoxSprzety.SelectedIndex].SpId, dataOd.Value, dataDo.Value))
                zmienCzas(BoxSprzety.SelectedIndex, dataOd.Value, dataDo.Value);
            else MessageBox.Show("Ten sprzęt jest już zarezerwowany w tym okresie.");
            odswiezListe();
            if (i != BoxSprzety.Items.Count-1)
            {
                BoxSprzety.SelectedIndex = i + 1;
            }
            else
            {
                BoxSprzety.SelectedIndex = i;
            }
        //KONIEC ZMIAN
        }

        private void zatwierdzDlaWszystkich_Click(object sender, EventArgs e)
        {
            TimeSpan odlegloscCzasowa = dataDo.Value - dataOd.Value;
            if (dataOd.Value.CompareTo(DateTime.Today) < 0)
            {
                MessageBox.Show("Data początkowa nie może być wcześniejsza niż dzisiejsza!");
            }
            else
            {
                if (dataDo.Value.CompareTo(dataOd.Value) < 0)
                {
                    MessageBox.Show("Data końcowa nie może być wcześniejsza niż data początkowa!");
                }
                else
                {
                    if(odlegloscCzasowa.Days > maksymalnyCzasWypozyczenia - 1)
                    {
                        MessageBox.Show("Czas wypożyczenia nie może być krótszy niż 1 dzień i dłuższy niż " + maksymalnyCzasWypozyczenia.ToString() + " dni!");
                    }
                    else
                    {
                        int i = -1;
                        bool czy_break = false;
                        foreach (BazaDanych.czas element in ListaCzasow)
                        {
                            i++;
                            if (BazaDanych.SprawdzDostepnosc(ListaSprzetow[i].SpId, dataOd.Value, dataDo.Value))
                                element.setDates(dataOd.Value, dataDo.Value);
                            else czy_break = true;
                            if (czy_break) break;
                        }
                        if (czy_break) MessageBox.Show("Sprzęt: " + ListaSprzetow[i].SpNazwa + " jest już zarezerwowany w tym okresie.");
                        odswiezListe();
                    }
                }
            }
        }

        //nowa funkcja pobiera informacje o dostępności przedmiotu w najbliższych 100 dniach i podświetla dni w kalendarzu
        private void wypelnijKalendarz(int idSprzetu)
        {
            kalendarz.SetDate(System.DateTime.Today);
            kalendarz.RemoveAllBoldedDates();
            TimeSpan ts = new TimeSpan(1, 0, 0, 0);
            DateTime dt = kalendarz.SelectionStart;
            for (int i = 0; i < 100; i++)
            {
                if(BazaDanych.SprawdzDostepnosc(idSprzetu, dt, dt))
                {
                    kalendarz.AddBoldedDate(dt);
                }
                dt = dt.Add(ts);
            }
            kalendarz.UpdateBoldedDates();
        }
    }
}
